/**
 * 
 */
package com.wilmar.process.dao.api;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.wilmar.common.util.PageinationEntity;
import com.wilmar.process.enumerate.EnumSystemQueryNameSet;

/**
 * @author MaKuBEX E-mail:makubexnet@gmail.com
 * @version 1.0.0 at Jul 31, 2009 2:14:08 PM
 * 
 */
public interface IBaseDAO<T, PK extends Serializable> {
	public T getDetail(PK id);

	/**
	 * 获取全部内容
	 * 
	 * @return 全部列表
	 */
	public List<T> getListAll();

	/**
	 * 获取全部内容
	 * 
	 * @param page
	 *            分页信息
	 * @return 全部列表
	 */
	public List<T> getListAll(PageinationEntity page);

	/**
	 * 根据实体例子进行精确查询
	 * 
	 * @param exampleInstance
	 *            实体例子
	 * @return 符合例子的列表
	 */
	public List<T> getListByExample(T exampleInstance);

	/**
	 * 根据实体例子进行精确查询
	 * 
	 * @param exampleInstance
	 *            实体例子
	 * @param page
	 *            分页信息
	 * @return 符合例子的列表
	 */
	public List<T> getListByExample(T exampleInstance, PageinationEntity page);

	/**
	 * 根据已经定义的查询语句查询对象
	 * 
	 * @param queryName
	 *            查询语句名称
	 * @return 查询语句结果集列表
	 */
	public List<T> getListByNamedQuery(EnumSystemQueryNameSet queryName);

	/**
	 * 根据预先定义的查询语句名称，并且给语句中的变量赋值进行查询
	 * 
	 * @param queryName
	 *            查询语句名称
	 * @param paramName
	 *            查询语句中变量名称
	 * @param value
	 *            对应的变量值
	 * @return 查询语句结果集列表
	 */
	public List<T> getListByNamedQueryAndNamedParam(
			EnumSystemQueryNameSet queryName, String paramName, Object value);

	/**
	 * 根据预先定义的查询语句名称，并且给语句中的变量赋值进行查询
	 * 
	 * @param queryName
	 *            查询语句名称
	 * @param paramNames
	 *            查询语句中变量名称数组
	 * @param values
	 *            变量数组对应的值
	 * @return 查询语句结果集列表
	 */
	public List<T> getListByNamedQueryAndNamedParams(
			EnumSystemQueryNameSet queryName, String[] paramNames,
			Object[] values);

	/**
	 * 合并一个已经被序列化的对象
	 * 
	 * @param detachedInstance
	 *            已经被序列化的对象
	 * @return 合并后的对象
	 */
	public T merge(T detachedInstance);

	/**
	 * 删除一个已经被序列化的对象
	 * 
	 * @param persistentInstance
	 *            需要被删除的对象
	 */
	public void remove(T persistentInstance);

	/**
	 * 删除一系列已经被序列化的对象
	 * 
	 * @param persistentInstances
	 *            需要被删除的对象集合
	 */
	public void removeAll(Collection<T> persistentInstances);

	/**
	 * 保存一个需要被序列化的对象
	 * 
	 * @param transientInstance
	 *            需要被序列化的对象
	 */
	public void save(T transientInstance);

	/**
	 * 保存一个需要被序列化的对象，如果该对象已经被序列化过，则更新该对象
	 * 
	 * @param instance
	 *            需要被保存/更新的对象
	 */
	public void saveOrUpdate(T instance);

	/**
	 * 保存一系列需要被序列化的对象，如果这些对象已经被序列化过，则更新这些对象
	 * 
	 * @param instanceList
	 *            需要被保存/更新的对象集合
	 */
	public void saveOrUpdateAll(Collection<T> instanceList);

	/**
	 * 更新一个已经被序列化的对象
	 * 
	 * @param persistentInstance
	 *            需要被更新的对象
	 */
	public void update(T persistentInstance);
}